package utiles;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JOptionPane;

/*
 * clase que contiene metodos para realizar validaciones de datos
 * 
 *
 */
public class Validador {

    private static final String ARROBA = "@";
    private static final String PUNTO = ".";
    private static final String BARRA = "/";
    private static Validador v;

    private Validador() {
    }

    static {
        v = new Validador();
    }

    public static Validador getInstance() {
        return v;
    }

    public static Validador gi() {
        return v;
    }

    private boolean esVocal(char letra) {

        if (letra == 'a' || letra == 'e' || letra == 'i' || letra == 'o'
                || letra == 'u' || letra == 'A' || letra == 'E' || letra == 'I'
                || letra == 'O' || letra == 'U') {
            return true;
        } else {
            return false;
        }

    }

    private boolean esConsonante(char letra) {
        if (letra == 'b' || letra == 'c' || letra == 'd' || letra == 'f'
                || letra == 'g' || letra == 'h' || letra == 'j' || letra == 'k'
                || letra == 'l' || letra == 'm' || letra == 'n' || letra == 'ñ'
                || letra == 'p' || letra == 'q' || letra == 'r' || letra == 's'
                || letra == 't' || letra == 'v' || letra == 'w' || letra == 'x'
                || letra == 'y' || letra == 'z' || letra == 'B' || letra == 'C'
                || letra == 'D' || letra == 'F' || letra == 'G' || letra == 'H'
                || letra == 'J' || letra == 'K' || letra == 'L' || letra == 'M'
                || letra == 'N' || letra == 'Ñ' || letra == 'P' || letra == 'Q'
                || letra == 'R' || letra == 'S' || letra == 'T' || letra == 'V'
                || letra == 'W' || letra == 'X' || letra == 'Y' || letra == 'Z') {
            return true;

        } else {
            return false;

        }

    }

    private boolean esVocalAcentuada(char letra) {

        if (letra == 'á' || letra == 'é' || letra == 'í' || letra == 'ó'
                || letra == 'ú' || letra == 'Á' || letra == 'É' || letra == 'Í'
                || letra == 'Ó' || letra == 'Ú') {
            return true;
        } else {
            return false;
        }

    }

    public boolean esLetra(char caracter) {
        if (esVocal(caracter) || esConsonante(caracter)
                || esVocalAcentuada(caracter)) {
            return true;
        } else {
            return false;
        }
    }

    public boolean esLetraYNumero(char caracter) {
        if (esVocal(caracter) || esConsonante(caracter)
                || esVocalAcentuada(caracter) || esNumero(caracter)) {
            return true;
        } else {
            return false;
        }
    }

    public boolean esNumero(char caracter) {
        if (caracter >= '0' && caracter <= '9') {
            return true;
        } else {
            return false;
        }
    }

    public boolean soloContieneLetras(String palabra) {
        char[] palabraEnCaracteres = palabra.toCharArray();
        for (int i = 0; i < palabraEnCaracteres.length; ++i) {
            if (!esLetra(palabraEnCaracteres[i])) {
                return false;
            }
        }
        return true;
    }

    public boolean soloContieneLetrasYPuntos(String palabra) {
        char[] palabraEnCaracteres = palabra.toCharArray();
        for (int i = 0; i < palabraEnCaracteres.length; ++i) {
            if (!esLetra(palabraEnCaracteres[i])
                    && !esPunto(palabraEnCaracteres[i])) {
                return false;
            }
        }
        return true;
    }

    public boolean soloContieneLetrasYNumeros(String palabra) {
        char[] palabraEnCaracteres = palabra.toCharArray();
        for (int i = 0; i < palabraEnCaracteres.length; ++i) {
            if (!esLetraYNumero(palabraEnCaracteres[i])) {
                return false;
            }
        }
        return true;
    }

    public boolean soloContieneLetrasYNumerosYEspacios(String palabra) {
        char[] palabraEnCaracteres = palabra.toCharArray();
        for (int i = 0; i < palabraEnCaracteres.length; ++i) {
            if (!esLetraYNumero(palabraEnCaracteres[i]) && !esEspacio(palabraEnCaracteres[i])) {
                return false;
            }
        }
        return true;
    }

    public boolean soloContieneNumerosYGuiones(String palabra) {
        char[] palabraEnCaracteres = palabra.toCharArray();
        for (int i = 0; i < palabraEnCaracteres.length; ++i) {
            if (!esNumero(palabraEnCaracteres[i])
                    && !esGuion(palabraEnCaracteres[i])) {
                return false;
            }
        }
        return true;
    }

    public boolean soloContieneNumeros(String palabra) {
        char[] palabraEnCaracteres = palabra.toCharArray();
        for (int i = 0; i < palabraEnCaracteres.length; ++i) {
            if (!esNumero(palabraEnCaracteres[i])) {
                return false;
            }
        }
        return true;
    }
 public boolean soloContieneNumeros1(int palabra) {
        String cantidad = String.valueOf(palabra);
        char[] palabraEnCaracteres = cantidad.toCharArray();
        for (int i = 0; i < palabraEnCaracteres.length; ++i) {
            if (!esNumero(palabraEnCaracteres[i])) {
                return false;
            }
        }
        return true;
    }
    public boolean soloContieneNumerosYPuntos(String palabra) {
        char[] palabraEnCaracteres = palabra.toCharArray();
        for (int i = 0; i < palabraEnCaracteres.length; ++i) {
            if (!esNumero(palabraEnCaracteres[i])
                    && !esPunto(palabraEnCaracteres[i])) {
                return false;
            }
        }
        return true;
    }

    public boolean soloContieneNumerosYPuntosOComa(String palabra) {
        char[] palabraEnCaracteres = palabra.toCharArray();
        for (int i = 0; i < palabraEnCaracteres.length; ++i) {
            if (!esNumero(palabraEnCaracteres[i])
                    || !esPunto(palabraEnCaracteres[i])
                    || !esComa(palabraEnCaracteres[i])) {
                return false;
            }
        }
        return true;
    }

    public boolean soloContieneLetrasYEspacios(String palabra) {
        char[] palabraEnCaracteres = palabra.toCharArray();
        for (int i = 0; i < palabraEnCaracteres.length; ++i) {
            if (!esLetra(palabraEnCaracteres[i])
                    && !esEspacio(palabraEnCaracteres[i])) {
                return false;
            }
        }
        return true;
    }

    public boolean esSignoPuntuacion(char caracter) {
        if (esComa(caracter) || esPunto(caracter) || esPuntoYComa(caracter)) {
            return true;
        } else {
            return false;
        }
    }

    private boolean esEspacio(char caracter) {
        if (caracter == ' ') {
            return true;
        } else {
            return false;
        }
    }

    private boolean esComa(char caracter) {
        if (caracter == ',') {
            return true;
        } else {
            return false;
        }

    }

    private boolean esPuntoYComa(char caracter) {
        if (caracter == ';') {
            return true;
        } else {
            return false;
        }

    }

    private boolean esPunto(char caracter) {
        if (caracter == '.') {
            return true;
        } else {
            return false;
        }

    }

    public boolean esTelefonoValido(String telefono) {
        char[] palabraEnCaracteres = telefono.toCharArray();
        for (int i = 0; i < palabraEnCaracteres.length; ++i) {
            if (!esNumero(palabraEnCaracteres[i])
                    && !esGuion(palabraEnCaracteres[i])
                    && !esParentesis(palabraEnCaracteres[i])
                    && !esEspacio(palabraEnCaracteres[i])) {

                return false;
            }
        }
        return true;
    }

    private boolean esParentesis(char caracter) {
        if (caracter == '(' || caracter == ')') {
            return true;
        } else {
            return false;
        }
    }

    private boolean esGuion(char caracter) {
        if (caracter == '-' || caracter == '_') {
            return true;
        } else {
            return false;
        }
    }

    public boolean esUsuarioValido(String nombreUsuario) {
        char[] palabraEnCaracteres = nombreUsuario.toCharArray();
        for (int i = 0; i < palabraEnCaracteres.length; ++i) {
            if (!esNumero(palabraEnCaracteres[i])
                    && !esGuion(palabraEnCaracteres[i])
                    && !esLetra(palabraEnCaracteres[i])
                    && !esPunto(palabraEnCaracteres[i])) {

                return false;
            }
        }
        return true;
    }

    public boolean passwrd(String pass) {
        if (pass.length() < 8) {
            return false;
        } else if (pass.length() > 15) {
            return false;
        } else {
            return true;
        }
    }
 public boolean longitudminmax5(String peso) {
        if (peso.length() < 2) {
            return false;
        } else if (peso.length() >4 ) {
            return false;
        } else {
            return true;
        }
    }
    public boolean repassword(String pas, String repass) {
        if (!pas.equals(repass)) {
            return false;
        } else {
            return true;
        }
    }

    public boolean esEmailValido(String email) {

        /* busco arroba */
        int posicionArroba = email.indexOf(ARROBA);
        if (posicionArroba == -1) {
            System.out.println("1");
            return false;
        }

        /* valido usuario */
        String nombreUsuario = email.substring(0, posicionArroba);
        if (!esUsuarioValido(nombreUsuario)) {
            System.out.println("2");
            return false;
        }

        /* busco el punto */
        int posicionPunto = email.indexOf(PUNTO);
        if (posicionPunto == -1) {
            System.out.println("3");
            return false;
        }

        String servidor = email.substring(posicionArroba + 1, posicionPunto);
        if (!esUsuarioValido(servidor)) {
            System.out.println("4");
            return false;
        }

        String dominio = email.substring(posicionPunto + 1);
        if (!soloContieneLetrasYPuntos(dominio)) {
            System.out.println("4" + dominio);
            return false;
        }

        return true;
    }

    public boolean esCuitValido(String cuit) {
        return true; //IMPLEMENTAR...
    }
    //FALTARIA UN VALIDAR NUMERO Y PUNTO O COMA

    public boolean esDouble(String cadena) {
        try {
            Double.parseDouble(cadena);
            return true;
        } catch (NumberFormatException nfe) {
            return false;
        }

    }

    public boolean esFloat(String cadena) {
        try {
            Float.parseFloat(cadena);
            return true;
        } catch (NumberFormatException nfe) {
            JOptionPane.showMessageDialog(null, "Error en el valor ingresado");


            return false;
        }

    }

    public boolean esInteger(String cadena) {
        try {
            Integer.parseInt(cadena);
            return true;
        } catch (NumberFormatException nfe) {
            return false;
        }

    }

    public boolean esPositivoInteger(Integer nro) {
        if (nro > 0) {
            return true;
        } else {
            return false;
        }
    }

    public boolean esPositivoFloat(Float nro) {
        if (nro > 0) {
            return true;
        } else {
            return false;
        }
    }

    public boolean esPositivoDouble(Double nro) {
        if (nro > 0) {
            return true;
        } else {
            return false;
        }
    }

    public static String cadena(String cadena, String nombre) throws ExcepcionValidacion {
        if (cadena.length() < 4) {
            throw new ExcepcionValidacion("[" + nombre + "] campo muy corto");
        }

        for (int i = 0; i < cadena.length(); i++) {
            char caracter = cadena.charAt(i);
            if (!Character.isLetter(caracter) && !(caracter == ' ')) {
                throw new ExcepcionValidacion("[" + nombre + "] campo invalido");
            }
        }
        return cadena;
    }

    //Valida que la cadena no sea vacia y no contenga numeros
    public static String cadenaCorrecta(String cadena, String campo) throws ExcepcionValidacion {
        String cadena1 = EValidacion.campoVacio(cadena, campo);
        return EValidacion.cadena(cadena1, campo);
    }

    public String obtenerFechaSistema() {
        Date fechaActual = new Date();
        String fechaAlta;
        String fecha = fechaActual.toString();
        // String fechaAlta=null;
        Calendar calendar = Calendar.getInstance();

        int dia = calendar.get(Calendar.DAY_OF_MONTH);   //dia del mes
        int mescal = calendar.get(Calendar.MONTH);  //mes, de 0 a 11

        //IF MES MENOR QUE 10 CONCATENAR UN CERO ADELANTE

        mescal = mescal + 1;

        int anio = calendar.get(Calendar.YEAR);  //año

        String diacalendar = String.valueOf(dia);
        String mescalendar = String.valueOf(mescal);

        if (mescal < 10) {
            mescalendar = "0" + String.valueOf(mescal);
            System.out.println("mescalendar es:" + mescal);
        }

        String aniocalendar = String.valueOf(anio);
        fechaAlta = diacalendar + "/" + mescalendar + "/" + aniocalendar;
        System.out.println("La fecha de hoy es: " + fechaAlta);
        return fechaAlta;
    }

    public boolean compararDosFechas(String fechafinca) {
        int diaActual = 0;
        int mesActual = 0;
        int añoActual = 0;
//    String diacalendar;
//    String mescalendar;
//    String aniocalendar;
        String diaV = fechafinca.substring(0, 2);
        System.out.println(fechafinca.substring(0, 2));
        String mesV = fechafinca.substring(3, 5);
        System.out.println(fechafinca.substring(3, 5));
        String añoV = fechafinca.substring(6, 10);
        System.out.println(fechafinca.substring(6, 10));

        int diaVen = Integer.parseInt(diaV);
        int mesVen = Integer.parseInt(mesV);
        int añoVen = Integer.parseInt(añoV);
        boolean resultado = false;

// ok!!!

        if (añoActual < añoVen) { //hoy es menor que cuando se vence entonces no esta vencido
            System.out.println("el año de fecha actual es menor o igual que cuando se vence entonces no esta vencido: " + añoVen + "FALSE");
            resultado = false;
        } else if (añoActual > añoVen) { //hoy es mayor que cuando se vence entonces está vencido
            System.out.println("el año de fecha actual es mayor que cuando se vence entonces está vencido: " + añoVen + "TRUE");
            resultado = true;
        } else {		// los años son iguales => comparar los meses
            System.out.println("los años son iguales: " + añoVen);
            if (mesActual < mesVen) {//hoy es menor que cuando se vence entonces no esta vencido
                System.out.println("el mes de fecha actual es menor que cuando se vence entonces no esta vencido: " + mesVen + "FALSE");
                resultado = false;
            } else if (mesActual > mesVen) {//hoy es mayor que cuando se vence entonces está vencido
                System.out.println("el mes de fecha actual  es mayor que cuando se vence entonces está vencido: " + mesVen + "TRUE");
                resultado = true;
            } else {		// los meses también son iguales => comparar los dias
                System.out.println("los meses son iguales: " + mesVen);
                if (diaActual < diaVen) {//hoy es menor que cuando se vence entonces no está vencido
                    System.out.println("el dia de fecha actual es menor que cuando se vence entonces no esta vencido" + diaVen + "FALSE");
                    resultado = false;
                } else if (diaActual > diaVen) {//hoy es mayor que cuando se vence entonces está vencido
                    System.out.println("el dia de fecha actual es mayor que cuando se vence entonces esta vencido: " + diaVen + "TRUE");
                    resultado = true;
                } else {		// los dias también son iguales => misma fecha
                    System.out.println("los dias son iguales: " + diaVen + "FALSE");
                    resultado = false;
                }
            }
        }

        return resultado;
    }

   public boolean soloContieneNumerosYPuntos1(Float cantidad) {
       String palabra = String.valueOf(cantidad);
        char[] palabraEnCaracteres = palabra.toCharArray();
        for (int i = 0; i < palabraEnCaracteres.length; ++i) {
            if (!esNumero(palabraEnCaracteres[i])
                    && !esPunto(palabraEnCaracteres[i])) {
                return false;
            }
        }
        return true;
    }


    public boolean compararContraFechaSistema(String fecha) {

        String dia = fecha.substring(0, 2);
        System.out.println(fecha.substring(0, 2));
        String mes = fecha.substring(3, 5);
        System.out.println(fecha.substring(3, 5));
        String año = fecha.substring(6, 10);
        System.out.println(fecha.substring(6, 10));

        int diaFecha = Integer.parseInt(dia);
        int mesFecha = Integer.parseInt(mes);
        int añoFecha = Integer.parseInt(año);

        String fechaSistema = Validador.getInstance().obtenerFechaSistema();

        String diaAct = fechaSistema.substring(0, 2);
        System.out.println(fechaSistema.substring(0, 2));
        String mesAct = fechaSistema.substring(3, 5);
        System.out.println(fechaSistema.substring(3, 5));
        String añoAct = fechaSistema.substring(6, 10);
        System.out.println(fechaSistema.substring(6, 10));

        int diaFechaSistema = Integer.parseInt(diaAct);
        int mesFechaSistema = Integer.parseInt(mesAct);
        int añoFechaSistema = Integer.parseInt(añoAct);

        boolean resultado = false;

        if (añoFechaSistema < añoFecha) {
            System.out.println("el año de fecha del sistema es menor que el año de fecha ingresada");
            resultado = false;
        } else if (añoFechaSistema == añoFecha && mesFechaSistema < mesFecha) {
            System.out.println("el mes de fecha del sistema es menor que el mes de fecha ingresada");
            resultado = false;
        } else if (añoFechaSistema == añoFecha && mesFechaSistema == mesFecha && diaFechaSistema < diaFecha) {
            System.out.println("el dia de fecha del sistema es menor que el dia de fecha ingresada");
            resultado = false;
        } else {
            resultado = true;
        }

        return resultado;
    }

    public boolean esFechaValida(String fecha) {//además de q sea fecha, valida q sea menor o igual a la del sistema
        try {
            SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
            String fechaConFormato = formatoFecha.parse(fecha).toString();
            char[] palabraEnCaracteres = fechaConFormato.toCharArray();
            if(palabraEnCaracteres.length == 10 ){
                for (int i = 0; i < palabraEnCaracteres.length; ++i) {
                    //podría sacar la parte q compara q en los caracteres indicados hayan nros o barras según corresponda, por q ya convertí la fecha ingresada en una fecha válida
                    if ( !(Validador.getInstance().compararContraFechaSistema(fechaConFormato)) && (!( ( ( i == 0 || i == 1 || i == 3 || i == 4 || i == 6 || i == 7 || i == 8 || i == 9 ) && ( esNumero( palabraEnCaracteres[i] ) ) ) || ( (i == 2 || i == 5) && ( palabraEnCaracteres[i] == BARRA.charAt(i) ) ) ) ) ) {
                        return false;
                    }
                }
            }
        } catch (Exception e) {
            return false;
        }
        return true;
    }
    
  
}
